iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1

使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)ISBN:9789864345304

本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:

更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。

讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看

天瓏網路書局:
https://www.tenlong.com.tw/products/9789864345304


此篇文章同步發表於個人部落格


研究一下別人的網址

我查了三個賣書的平台,搜尋條件如下

參數
關鍵字 ux
分類 中文書
價格 20 ~ 500
排列順序 精準度

查詢可以用POST嗎?

我個人是覺得不適合!不管你的程式邏輯要怎麼設計,篩選、排序的方式,我建議用GET,最大的好處就是可以把網址分享給別人,就像我把網址貼來這裡,點進去就可以直接看到我下的條件有哪些,如果用POST 無法分享那些篩選條件!

分析別人怎麼做

參數 變數 備註
關鍵字 qkey
分類 zoneqsubcategory 最後一個網址還有 categoryLV 應該是用來辨識現在是在哪一個層級的分類(類所無限階層的那種設計,分類下面還可以自由新增子分類階層數量)
價格最低 pr_lowadv_price_min
價格最高 pr_mostadv_price_max
排列順序 sort

基本上它們都有特定方式來排序以及篩選,上面表格整理出來的變數名稱,也是參考而已,可以多看看別人怎麼設計,未來可以應用在自己的專案上。

符合業主的需求,有分類可以篩選中文書、英文書… 價格最低值、最高值,需求有到了就可以,以實際面來看,功能實用,若不符合需求什麼都不是,也完全沒有價值,而且簡單易用也是一個優勢。

但因為我希望做到自由度高一點的功能,所以篩選的部分。 讓請求客戶端可以自己決定,例如 name 包含 黑 ,地區包含台北兩個字之類的讓請求者自行設定篩選條件,暫時不對系統做客製化的邏輯設計。

撰寫程式

昨天已製作完成的分頁及標記方式!加入對欄位的篩選。

app/Http/Controllers/AnimalController.php

public function index(Request $request)
{
    // 設定預設值

    $marker = isset($request->marker) ? $request->marker : 1;
    $limit = isset($request->limit) ? $request->limit : 10;

    $query = Animal::query();

    // 篩選欄位條件
    if (isset($request->filters)) {
        $filters = explode(',', $request->filters);
        foreach ($filters as $key => $filter) {
            list($criteria, $value) = explode(':', $filter);
            $query->where($criteria, 'like', "%$value%");

        }
    }

    $animals = $query->where('id', '>=', $marker)->paginate($limit);

    return response($animals, Response::HTTP_OK);
}

利用 filters 變數搭配 欄位名稱:篩選關鍵字 這樣的格式做篩選

/api/animal?filters=name:黑

找到名稱有「黑」的動物資料

/api/animal?filters=name:黑,personality:可愛

找到名稱有「黑」的動物資料 並且 personality欄位 有「可愛」兩個字

還有很多設計方式!可以多看看,找到一個符合需求的方法


參考

https://www.moesif.com/blog/technical/api-design/REST-API-Design-Filtering-Sorting-and-Pagination/#


上一篇
動物列表查詢及分頁
下一篇
動物排序
系列文
使用 Laravel 打造 RESTful API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言